unsigned long syscall_stats[NR_syscalls];
static unsigned char foobar[4];
+unsigned long c_do_page_fault;
+unsigned long c_minor_page_fault;
+unsigned long c_major_page_fault;
+
/* a write just resests the counter */
static ssize_t syscall_write(struct file *f, const char *data,
size_t size, loff_t *pos)
{
printk("resetting syscall stats\n");
memset(&syscall_stats, 0, sizeof(syscall_stats));
+ c_do_page_fault = 0;
+ c_minor_page_fault = 0;
+ c_major_page_fault = 0;
return size;
}
seq_printf(m, "%lu ", syscall_stats[i]);
}
seq_printf(m, "\n");
+ seq_printf(m, "%lu %lu %lu\n", c_do_page_fault,
+ c_minor_page_fault, c_major_page_fault);
+
return 0;
}
* bit 1 == 0 means read, 1 means write
* bit 2 == 0 means kernel, 1 means user-mode
*/
+
+extern unsigned long c_do_page_fault;
+extern unsigned long c_minor_page_fault;
+extern unsigned long c_major_page_fault;
+
fastcall void do_page_fault(struct pt_regs *regs, unsigned long error_code,
unsigned long address)
{
int write;
siginfo_t info;
+ c_do_page_fault++;
+
/* Set the "privileged fault" bit to something sane. */
error_code &= 3;
error_code |= (regs->xcs & 2) << 1;
switch (handle_mm_fault(mm, vma, address, write)) {
case VM_FAULT_MINOR:
tsk->min_flt++;
+ c_minor_page_fault++;
break;
case VM_FAULT_MAJOR:
tsk->maj_flt++;
+ c_major_page_fault++;
break;
case VM_FAULT_SIGBUS:
goto do_sigbus;